var BOSH_SERVICE = '/http-bind/';
var IMAGES_PATH = 'img/chat/';
var connection = null;
var totalConectados = 0;
var estado="offline";
var menuOpciones = null;
var hashCodificado = null;
var tabView = null;
    /*
         Initialize and render the Menu when the element it is to be 
         rendered into is ready to be scripted.
    */

    YAHOO.util.Event.onAvailable("situacionMenuChat", function () {

        /*
             Define an array of object literals, each containing 
             the configuration properties necessary to create a MenuItem and 
             its corresponding submenu.
        */

       var aItems = [
			{
                text: "Conectar", 
                onclick : { fn: conectarChat} , 
            },
            {
                text: "Sub nombre", 
                url: "javascript:cambiarSubNombreForm()", 
            },
			{
                text: "Historial", 
                url: "javascript:HistorialForm()", 
            },
            {
                text: "Cambiar estado", 
                url: "#", 
                submenu: {
                    id: "estados", 
                    itemdata: [

                        { text: "Disponible", onclick: { fn: cambiarEstado, obj: "null" } },
                        { text: "Ausente", onclick: { fn: cambiarEstado, obj: "away" } },
                        { text: "No disponible", onclick: { fn: cambiarEstado, obj: "dnd" } }
            
                    ] 
                } 
            }            
        ];                


        /*
			Instantiate a Menu:  The first argument passed to the constructor
			is the id for the Menu element to be created, the second is an 
			object literal of configuration properties.
        */

        menuOpciones = new YAHOO.widget.Menu("listaOpcionesChat", {context: ["barraEstado", "tr", "br"] });

 function onShow(p_sType, p_aArgs) {  
    
    YAHOO.util.Dom.setStyle('listaOpcionesChat', 'top', "0px");
    
    }
menuOpciones.subscribe("show", onShow);


//        menuOpciones2 = new YAHOO.widget.Menu("listaAmigosChat", {context: ["listaAmigosChatPos", "tr", "br"] });




        /*
            Add items to the Menu instance by passing an array of object literals 
            (each of which represents a set of YAHOO.widget.MenuItem 
            configuration properties) to the "addItems" method.
        */

        menuOpciones.addItems(aItems);
        submenus =menuOpciones.getSubmenus();
        submenus[0].getItem(0).cfg.setProperty("checked",true);
        
        menuOpciones.getItem(1).cfg.setProperty("disabled",true);
        menuOpciones.getItem(2).cfg.setProperty("disabled",true);
        menuOpciones.getItem(3).cfg.setProperty("disabled",true);
        
/*
items = oMenu.getItems();
submenus =oMenu.getSubmenus();
//for(i=0;i<=items.length;i++)
//{
	////alert(oMenu.getItem(3).getItems().getItem(0).cfg.getProperty("text"));
	submenus =oMenu.getSubmenus();
	submenus[0].getItem(0).cfg.setProperty("checked",false);
	submenus[0].getItem(1).cfg.setProperty("checked",false);
	submenus[0].getItem(2).cfg.setProperty("checked",false);
	//alert(items[i].getProperty("text"));
//}
//alert(oMenu.getItemGroups());
*/
        /*
            Since this Menu instance is built completely from script, call the 
            "render" method passing in the DOM element that it should be 
            appended to.
        */
        
        menuOpciones.render("situacionMenuChat");


        YAHOO.util.Event.addListener("menuChatOpciones", "click", menuOpciones.show, null, menuOpciones);
    
    });
    

/*function log(msg) 
{
    $('#log').append('<div></div>').append(document.createTextNode(msg));
}
*/
function onConnect(status)
{
    if (status == Strophe.Status.CONNECTING) {
		//log('Strophe is connecting.');
		barraEstado("connecting");
		estado="connecting";
    } else if (status == Strophe.Status.CONNFAIL) {
		//log('Strophe failed to connect.');
		barraEstado("offline");
		estado="offline";
		$('#connect').get(0).value = 'connect';
    } else if (status == Strophe.Status.DISCONNECTING) {
		//log('Strophe is disconnecting.');
		barraEstado("connecting");
		estado="connecting";
    } else if (status == Strophe.Status.DISCONNECTED) {
		
		menuOpciones.getItem(0).cfg.setProperty("text","Conectar");
		menuOpciones.getItem(0).cfg.setProperty("onclick", { fn: conectarChat});
		
		menuOpciones.getItem(1).cfg.setProperty("disabled",true);
		menuOpciones.getItem(2).cfg.setProperty("disabled",true);
		menuOpciones.getItem(3).cfg.setProperty("disabled",true);
    
    
    $("#listaAmigosChat").text("");

	totalConectados = 0;
	$("#totalConectados").text("("+totalConectados+")");
	$("#listaAmigosChat").hide("normal");
    
		//log('Strophe is disconnected.');
		barraEstado("offline");
		estado="offline";
		$('#connect').get(0).value = 'connect';
    } else if (status == Strophe.Status.CONNECTED) {
		
		submenus =menuOpciones.getSubmenus();
		submenus[0].getItem(0).cfg.setProperty("checked",true);
		
		menuOpciones.getItem(0).cfg.setProperty("text","Desconectar");
		menuOpciones.getItem(0).cfg.setProperty("onclick", { fn: desconectarChat});
       
		menuOpciones.getItem(1).cfg.setProperty("disabled",false);
		menuOpciones.getItem(2).cfg.setProperty("disabled",false);
		menuOpciones.getItem(3).cfg.setProperty("disabled",false);
    
    
		barraEstado("online");
		estado="online";
		//log('Strophe is connected.');
		//log('ECHOBOT: Send a message to ' + connection.jid + 
		//	' to talk to me.');
		//$("#listaAmigosChat").text("<div style=\"width:100px\">");
		connection.addHandler(onMessage, null, 'message', null, null,  null); 
		connection.addHandler(onPresencea, null, 'presence', null, null,  null); 
		connection.addHandler(onIq, null, 'iq', null, null,  null); 
		connection.send($pres().tree());
    }
}

function onIq(msg)
{
	//Para un futuro se podran procesar mas Iq
	//alert("Recibido iq "+msg.toString());
	//var to = msg.getAttribute('to');
    var from = msg.getAttribute('from');
	//var type = msg.getAttribute('type');
	//var id = msg.getAttribute('id');
	
	var vCard = msg.getElementsByTagName('vCard')[0];
	//var xmlns = vCard.getAttribute('xmlns');
	//var status = msg.getElementsByTagName('status')[0];

	var nombre = Strophe.getText(vCard.getElementsByTagName('FN')[0]);
	//alert("Recibiendo de "+from+" xm es "+xmlns+" y nombre es "+Strophe.getText(fN));
    cambiarNombre(from,nombre);

	return true;
}

function cambiarNombre(jid,nombre)
{
	//Cambia el nombre a mostrar de un jid. Busca el jid formateado (sin puntos ni arrobas)
	idDiv=Strophe.getNodeFromJid(jid)+""+Strophe.getDomainFromJid(jid).split(".")[0]+""+Strophe.getDomainFromJid(jid).split(".")[1];
	$('#'+idDiv).children("a").children(".nombre").text(nombre);
}


function chatearCon(to)
{
	//Abre la ventana de chat con una persona. Si ya existe, hace focus en ella
	if(!existeConversacion(to))
	{
		crearConversacion(to);
	}
	chatConversaciones.show();
	
	indice = indiceTabConversacion(to);
	tabView.selectTab(indice);
}

function existeConversacion(jid)
{
	//Comprueba si existe una conversacion abierta con ese jid
	if($("em:contains('"+jid+"')").length)
		return true;
	else
		return false;
}

function insertarMensaje(jid,mensaje,nombre)
{
	//Inserta un mensaje en una conversacion. El nombre es el nombre con el que aparece el autor del mensaje
	//Tambien se encarga de las alertas, poner en verde el titulo y esos avisos de mensaje nuevo
	idDiv=Strophe.getNodeFromJid(jid)+""+Strophe.getDomainFromJid(jid).split(".")[0]+""+Strophe.getDomainFromJid(jid).split(".")[1];
	if(nombre.length==0)
	{
		nombre=Strophe.getNodeFromJid(jid)+"@"+Strophe.getDomainFromJid(jid);
	}
		
	var fecha = new Date();
	
	$("#chat"+idDiv).append("<dt>(" + fecha.getHours() + ":" + fecha.getMinutes() + ":" + fecha.getSeconds()+") <b>"+nombre+"</b>: "+mensaje+"<dt>");
	indice = indiceTabConversacion(jid);
	if(chatConversaciones.cfg.getProperty("visible"))
	{
		//Para que no se seleccione si ya esta seleccionado
		if(tabView.get("activeIndex") != indice)
			avisoTab(indice);
	}else{
		barraEstado("new");
		if(tabView.get("activeIndex") != indice)
		{
			avisoTab(indice);
			tabView.selectTab(indice);
		}
	}
}

function avisoTab(indice)
{
	//Mara como que hay menajes nuevos en una conversacion
	tab = tabView.getTab(indice);
	if(tab.get("label").indexOf("<")==-1)
		tab.set("label","<font sytle=\"font-weight: bold;\" color=\"green\">"+tab.get("label")+"</font>");
}

function quitarAvisoTab(indice)
{
	tab = tabView.getTab(indice);
	tab.set("label",tab.get("label").split(">")[1].split("<")[0]);
}

function indiceTabConversacion(jid)
{
	//Obtiene el indice del tab de una determinada conversacion
	if($("em:contains('"+jid+"')").length)
	{
		encontrado=false;
		//totales = $("#demo").children("ul").children("li").length;
		i=0;
		while(encontrado==false)
		{
			if($("#demo").children("ul").children("li").children("a").children("em:eq("+i+")").text() == jid)
				encontrado=true;
			else
				i++;

		}
		return i;
	}else return null;
}

function onPresencea(msg)
{
	//Cuando se recibe un presence, se comprueba de que tipo es
	//Si se acaba de conectar, tambien pide el vcard para saber su nombre
	//Si cambia de estado, tambien actualiza la lista de amigos conectados
	var to = msg.getAttribute('to');
    var from = msg.getAttribute('from');
    var type = msg.getAttribute('type');
	var show = msg.getElementsByTagName('show')[0];
	var status = msg.getElementsByTagName('status')[0];
	
	
	//log("Presencia de "+from+" a "+to+" mostara "+Strophe.getText(show)+" y status es "+Strophe.getText(status));
		idDiv=Strophe.getNodeFromJid(from)+""+Strophe.getDomainFromJid(from).split(".")[0]+""+Strophe.getDomainFromJid(from).split(".")[1];
	
		
	if(type==null)
	{//El usuario a entrado o cambiado su estado a cualquier menos offline
		if(Strophe.getText(show)==null)
		{
			imagenEstado = IMAGES_PATH + "online.png";
		}else{	
			imagenEstado = IMAGES_PATH + Strophe.getText(show)+".png";
		}
		
		
		if(!$('#'+idDiv).length)
		{
			totalConectados++;
			$("#totalConectados").text("("+totalConectados+")");
			nuevo = $("<div style=\"width: 150px\">");
			nuevo.attr("id",idDiv);
			
			nuevoA = $("<a>");
			nuevoA.attr("href","javascript:void(0)");
			nuevoA.click(function () { 
				chatearCon(from);
			});
			
			
			mostrarComo = $('<img>');
			mostrarComo.attr("class","mostrar");
			mostrarComo.attr("src",imagenEstado);
			
			nombre = $('<span>');
			nombre.attr("class","nombre");
			nombre.text(Strophe.getNodeFromJid(from)+"@"+Strophe.getDomainFromJid(from));
			
			mensaje = $('<span>');
			mensaje.attr("class","mensaje");
			mensaje.text(Strophe.getText(status));
			
			nuevoA.append(nombre);
			
			nuevo.append(mostrarComo);
			nuevo.append(nuevoA);
			nuevo.append(mensaje);
			$('#listaAmigosChat').append(nuevo);
			pedirVCard(from);
			
		}else
		{
			$('#'+idDiv).children(".mostrar").attr("src",imagenEstado);
			$('#'+idDiv).children(".mensaje").text(Strophe.getText(status));
		}
	}else{
		if(type == "unavailable")
		{//El usuario se ha desconectado o no esta conectado
			if($('#'+idDiv).length)
			{
				//Confirmado, el usuario ha pasado de online a offline (porque no existia en la lista)
				totalConectados--;
				$("#totalConectados").text("("+totalConectados+")");
				$('#'+idDiv).remove();
			}
		}
	}

	return true;
}

function crearConversacion(jid)
{
	//Crea una conversacion. Si no existe, se abre y se hace focus en ella
	idDiv=Strophe.getNodeFromJid(jid)+""+Strophe.getDomainFromJid(jid).split(".")[0]+""+Strophe.getDomainFromJid(jid).split(".")[1];
	tab = new YAHOO.widget.Tab({ label: jid, content: "<dl id=\"chat"+idDiv+"\"></dl><textarea id=\"text"+idDiv+"\"></textarea>" });
	tabView.addTab( tab );
	
				   tinyMCE.init({
		// General options
		mode : "exact",
		elements : "text"+idDiv,
		theme : "advanced",
		skin : "o2k7",
		plugins : "advimage,advlink,emotions,inlinepopups,media",

		// Theme options
		theme_advanced_buttons1 : "emotions,|,bold,italic,underline,strikethrough,|,link,image,media",
		theme_advanced_toolbar_location : "top",
		theme_advanced_toolbar_align : "left",
		theme_advanced_resizing : true,

		// Example content CSS (should be your site CSS)
		content_css : "/plantillas/cssTinyMCE.php",

		// Drop lists for link/image/media/template dialogs
		template_external_list_url : "lists/template_list.js",
		external_link_list_url : "lists/link_list.js",
		external_image_list_url : "lists/image_list.js",
		media_external_list_url : "lists/media_list.js",
		setup : function(ed) {
			ed.onKeyUp.add(function(ed, event) {
				if(event.keyCode == 13 && event.shiftKey == 0 && ed.getContent().indexOf("<p>&nbsp;</p>") != 0)  {
					message = ed.getContent();
					message = message.replace(/^\s+|\s+$/g,"");
					message = message.replace("<p>","");
					message = message.replace("</p>","");
					message = message.replace("<p>","");
					message = message.replace("</p>","");
					message = message.replace("&nbsp;","");
					message = message.substr(0,message.length-1);

					ed.setContent('');
					if (message != '') {
						enviarMensaje(jid,message);
						insertarMensaje(jid,message,"Yo");
					}

					return false;
				}else if (event.keyCode == 13 && event.shiftKey == 0)
				{
					ed.setContent("");
				}
			}),
			ed.onSetContent.add(function() {
				window.focus();
				ed.focus();
			});
			
		}

	});
	
	return tab;
}

function onMessage(msg) {
    var to = msg.getAttribute('to');
    var from = msg.getAttribute('from');
    var type = msg.getAttribute('type');
    var elems = msg.getElementsByTagName('body');

    if (type == "chat" && elems.length > 0) {
		var body = elems[0];

		//log('ECHOBOT: I got a message from ' + from + ': ' + 
		//	Strophe.getText(body));
		
		if(existeConversacion(from))
		{
			insertarMensaje(from,Strophe.getText(body),"");
		}else{
			crearConversacion(from);
			insertarMensaje(from,Strophe.getText(body),"");
		}
    }

    // we must return true to keep the handler alive.  
    // returning false would remove it after it finishes.
    return true;
}

function procesarComando(data)
{
	alert(data);
}
//YAHOO.example.amigos
//function cambiarEstado(to,estado,subnombre)
function cambiarEstado(tipo,evento,estadoNuevo)
{
	
	submenus = menuOpciones.getSubmenus();
	submenus[0].getItem(0).cfg.setProperty("checked",false);
	submenus[0].getItem(1).cfg.setProperty("checked",false);
	submenus[0].getItem(2).cfg.setProperty("checked",false);
	
	this.cfg.setProperty("checked",true);
	
	estado = estadoNuevo;
	barraEstado(estado);
	presencia = $pres({from:connection.jid})
	.c('show').t(estado);
	/*
	presencia = $pres({to: to, from:connection.jid})
	.c('show').t(estado)
	.up()
	.c('status').t(subnombre);
	*/
	
	//alert(presencia.toString());
	//show.innerHTML="dnd";
	
	//status = document.createElement("status");
	//status.innerHTML="Heyyyyyy";
		
	//presencia.appendChild(show);
	//presencia.appendChild(status);
	connection.send(presencia.tree());
}

function pedirVCard(to)
{
	iq = $iq({from: connection.jid, id: 'v3', to: to, type:'get'})
	.c("vCard",{xmlns: 'vcard-temp'});
	connection.send(iq.tree());
}



function enviarChat(evento,from)
{
	if(evento.keyCode == 13)
	{
		idDiv=Strophe.getNodeFromJid(from)+""+Strophe.getDomainFromJid(from).split(".")[0]+""+Strophe.getDomainFromJid(from).split(".")[1];
		//alert($("#text"+idDiv).text()+"  "+idDiv);
		insertarMensaje(from,mensaje,Strophe.getNodeFromJid(connection.jid)+"@"+Strophe.getDomainFromJid(connection.jid));
		
	}
}

function enviarMensaje(to,mensaje)
{
	msg = $msg({from: connection.jid, type: 'chat', to: to, xmlns: 'jabber:client'})
	.c("body").t(mensaje);
	connection.send(msg.tree());
}

function mostrarConversaciones()
{
	if(tabView.getTab(0) != null)
	{
		chatConversaciones.show();
		barraEstado(estado);
	}
	
}

function barraEstado(tipo)
{
	if(tipo == "away")
	{
		$("#barraEstado").attr("src",IMAGES_PATH+"tray-away.png");
		$("#barraEstado").attr("title","Estoy ausente");
	}else if(tipo == "dnd")
	{
		$("#barraEstado").attr("src",IMAGES_PATH+"tray-dnd.png");
		$("#barraEstado").attr("title","No estoy disponible");
	}else if(tipo == "connecting")
	{
		$("#barraEstado").attr("src",IMAGES_PATH+"tray-connecting.png");
		$("#barraEstado").attr("title","Conectando...");
	}else if(tipo == "new")
	{
		$("#barraEstado").attr("src",IMAGES_PATH+"tray-new-im.png");
		$("#barraEstado").attr("title","Nuevo mensaje");
	}else if(tipo == "offline")
	{
		$("#barraEstado").attr("src",IMAGES_PATH+"tray-offline.png");
		$("#barraEstado").attr("title","Desconectado");
	}else{
		$("#barraEstado").attr("src",IMAGES_PATH+"tray-online.png");
		$("#barraEstado").attr("title","Conectado");
	}
	
}


function conectarChat()
{	

YAHOO.util.Cookie.set("conectar","true");
connection.connect(YAHOO.util.Cookie.get("jid")+"/Wixet","",
				   onConnect);
				   
	/*jid="maxpowel@cutrenti.es/Wixet";
	pass="c0l1LL4s";
	barraEstado("connecting");
	    connection.connect(jid,pass,
			       onConnect);*/
}

function desconectarChat()
{
    connection.disconnect(); 
	YAHOO.util.Cookie.set("conectar","false");
	
}

function restaurar(ev)
{
	tab = tabView.getTab(ev.newValue);
	
	if(tab.get("label").indexOf("<")==0)
		tab.set("label",tab.get("label").split(">")[1].split("<")[0]);
	
}


function cambiarTamChat()
{
	if($("#listaAmigosChat").is(':hidden'))
	{
		//overlayListaAmigosChat.cfg.setProperty("context",["situacionMenuChat","tl","bl", ["beforeShow", "windowResize"]]);
		//overlayListaAmigosChat.align("situacionMenuChat","situacionMenuChat");
		if(totalConectados > 0)
			$("#listaAmigosChat").show("normal");
	}
	else
	{
		$("#listaAmigosChat").hide("normal");
	}
}
	
$(document).ready(function () {
	
	chatConversaciones = new YAHOO.widget.Panel("chatConversaciones", 
						{ 
						  visible : false, 
						  constraintoviewport : true
						});
						chatConversaciones.render();
							
		

    tabView = new YAHOO.widget.TabView('demo');
	tabView.on('activeIndexChange',restaurar);
	
		chat = new YAHOO.widget.Dialog("chat", 
							{ 
							  visible : true, 
							  constraintoviewport : true
							});
	chat.show();
	
	$("#listaAmigosChat").hide();

	$("#imagenMenu").attr("src",IMAGES_PATH+"menu.png");
	$("#imagenMenu").attr("title","Opciones");
	$("#imagenMenu").attr("border","0");
		
	barraEstado("offline");
    connection = new Strophe.Connection(BOSH_SERVICE);

    // Uncomment the following lines to spy on the wire traffic.
     //connection.rawInput = function (data) { log('RECV: ' + data); };
	 //connection.rawOutput = function (data) { log('SEND: ' + data); };
	//connection.rawInput = procesarComando;
    //connection.rawOutput = procesarComando;

    // Uncomment the following line to see all the debug output.
    //Strophe.log = function (level, msg) { log('LOG: ' + msg); };

    
    if(YAHOO.util.Cookie.get("conectar")!="false")
    {
		conectarChat();
	}
});
